/*
 * Copyright (c) 2024 AlgoIdeas <yu19881234@163.com>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

#include "iot_errno.h"
#include "iot_gpio_ex.h"

#include "ohos_init.h"
#include "cmsis_os2.h"

#include "bh1750.h"
#include "sht3x.h"

#include "peripheral.h"

/* LED */
#define IOT_GPIO_IDX_RED_LED        7
#define IOT_GPIO_IDX_YELLOW_LED     10
#define IOT_GPIO_IDX_GREEN_LED      11

/* Button */
#define IOT_GPIO_IDX_SWITCH         14

/* I2C */
#define IOT_GPIO_IDX_I2C1           1
#define IOT_GPIO_IDX_I2C1_SDA       15
#define IOT_GPIO_IDX_I2C1_SDL       16

/* GPIO */
#define IOT_GPIO_IDX_PUMP1_SWITCH    9   // A9
#define IOT_GPIO_IDX_PUMP2_SWITCH    12  // A12


void LedOnOff(LedType type, bool enable)
{
    switch(type) {
        case LED_RED:
            IoTGpioSetOutputVal(IOT_GPIO_IDX_RED_LED, enable ? 1 : 0);
            break;
        case LED_YELLOW:
            IoTGpioSetOutputVal(IOT_GPIO_IDX_YELLOW_LED, enable ? 1 : 0);
            break;
        case LED_GREEN:
            IoTGpioSetOutputVal(IOT_GPIO_IDX_GREEN_LED, enable ? 1 : 0);
            break;
        default:
            break;
    }
}

void WaterPumpInOnOff(bool enable)
{
    printf("Water PumpIn %s\r\n", enable ? "ON" : "OFF");

    if (enable) {
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP1_SWITCH, 1);
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP2_SWITCH, 0);
    } else {
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP1_SWITCH, 0);
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP2_SWITCH, 0);
    }
}

void WaterPumpDownOnOff(bool enable)
{
    printf("Water PumpDown %s\r\n", enable ? "ON" : "OFF");

    if (enable) {
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP1_SWITCH, 0);
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP2_SWITCH, 1);
    } else {
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP1_SWITCH, 0);
        IoTGpioSetOutputVal(IOT_GPIO_IDX_PUMP2_SWITCH, 0);
    }
}

void SensorRead(float *temp, float *humi, float *lux)
{
    SHT3XReadData(temp, humi);
    BH1750ReadData(lux);
    return ;
}

void PeripheralInit(void)
{
    /* Initial pump gpio */
    IoTGpioInit(IOT_GPIO_IDX_PUMP1_SWITCH);
    IoSetFunc(IOT_GPIO_IDX_PUMP1_SWITCH, IOT_IO_FUNC_GPIO_9_GPIO);
    IoTGpioSetDir(IOT_GPIO_IDX_PUMP1_SWITCH, IOT_GPIO_DIR_OUT);

    IoTGpioInit(IOT_GPIO_IDX_PUMP2_SWITCH);
    IoSetFunc(IOT_GPIO_IDX_PUMP2_SWITCH, IOT_IO_FUNC_GPIO_12_GPIO);
    IoTGpioSetDir(IOT_GPIO_IDX_PUMP2_SWITCH, IOT_GPIO_DIR_OUT);

    /* Initial LED */
    IoTGpioInit(IOT_GPIO_IDX_GREEN_LED);
    IoSetFunc(IOT_GPIO_IDX_GREEN_LED, IOT_IO_FUNC_GPIO_11_GPIO);
    IoTGpioSetDir(IOT_GPIO_IDX_GREEN_LED, IOT_GPIO_DIR_OUT);

    IoTGpioInit(IOT_GPIO_IDX_YELLOW_LED);
    IoSetFunc(IOT_GPIO_IDX_YELLOW_LED, IOT_IO_FUNC_GPIO_10_GPIO);
    IoTGpioSetDir(IOT_GPIO_IDX_YELLOW_LED, IOT_GPIO_DIR_OUT);

    IoTGpioInit(IOT_GPIO_IDX_RED_LED);
    IoSetFunc(IOT_GPIO_IDX_RED_LED, IOT_IO_FUNC_GPIO_7_GPIO);
    IoTGpioSetDir(IOT_GPIO_IDX_RED_LED, IOT_GPIO_DIR_OUT);

    /* Initial I2C */
	IoTGpioInit(IOT_GPIO_IDX_I2C1_SDA);
	IoTGpioInit(IOT_GPIO_IDX_I2C1_SDL);
    IoSetFunc(IOT_GPIO_IDX_I2C1_SDA, IOT_IO_FUNC_GPIO_15_I2C1_SDA); /* I2C1_SDA */
    IoSetFunc(IOT_GPIO_IDX_I2C1_SDL, IOT_IO_FUNC_GPIO_16_I2C1_SCL); /* I2C1_SCL */
    IoTI2cInit(IOT_GPIO_IDX_I2C1, 400000); /* baudrate: 400kbps */
    IoTI2cSetBaudrate(IOT_GPIO_IDX_I2C1, 400000);

    printf("SHT3XInit ...\r\n");
    SHT3XInit();
    SHT3XReset();

    printf("BH1750Init ...\r\n");
    BH1750Init();

    LedOnOff(LED_GREEN, false);

    WaterPumpInOnOff(false);

    printf("PeripheralInit.\r\n");

    return ;
}
